package handler

import (
	"net/http"

	"pgm/internal/generator"
	"pgm/internal/introspect"
	"pgm/internal/models"

	"github.com/gin-gonic/gin"
)

// APIHandler API处理器
type APIHandler struct {
	dynamicAPI *generator.DynamicAPI
	inspector  *introspect.Inspector
}

// NewAPIHandler 创建API处理器
func NewAPIHandler() *APIHandler {
	return &APIHandler{
		dynamicAPI: generator.NewDynamicAPI(),
		inspector:  introspect.NewInspector(),
	}
}

// GetTables 获取数据库表列表
// @Summary 获取数据库表列表
// @Description 获取当前数据库中的所有表信息
// @Tags 表管理
// @Accept json
// @Produce json
// @Param schema query string false "数据库架构名称" default(public)
// @Success 200 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/tables [get]
func (h *APIHandler) GetTables(c *gin.Context) {
	schema := c.DefaultQuery("schema", "public")

	tables, err := h.inspector.GetTables(schema)
	if err != nil {
		c.JSON(http.StatusInternalServerError, models.NewErrorResponse(500, "获取表列表失败: "+err.Error()))
		return
	}

	c.JSON(http.StatusOK, models.NewSuccessResponse(tables))
}

// GetTable 获取单个表信息
// @Summary 获取单个表信息
// @Description 根据表名获取表的详细信息
// @Tags 表管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Param schema query string false "数据库架构名称" default(public)
// @Success 200 {object} models.APIResponse
// @Failure 404 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/tables/{tableName} [get]
func (h *APIHandler) GetTable(c *gin.Context) {
	tableName := c.Param("tableName")
	schema := c.DefaultQuery("schema", "public")

	table, err := h.inspector.GetTableByName(tableName, schema)
	if err != nil {
		c.JSON(http.StatusNotFound, models.NewErrorResponse(404, "表不存在: "+err.Error()))
		return
	}

	c.JSON(http.StatusOK, models.NewSuccessResponse(table))
}

// GetRecords 获取表记录列表
// @Summary 获取表记录列表
// @Description 分页获取指定表的记录列表
// @Tags 数据管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页大小" default(20)
// @Param order_by query string false "排序字段"
// @Param order query string false "排序方向" Enums(asc, desc)
// @Param search query string false "搜索关键词"
// @Success 200 {object} models.APIResponse
// @Failure 400 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/data/{tableName} [get]
func (h *APIHandler) GetRecords(c *gin.Context) {
	tableName := c.Param("tableName")

	var pagination models.PaginationRequest
	if err := c.ShouldBindQuery(&pagination); err != nil {
		c.JSON(http.StatusBadRequest, models.NewErrorResponse(400, "参数错误: "+err.Error()))
		return
	}

	result, err := h.dynamicAPI.GetRecords(tableName, pagination)
	if err != nil {
		c.JSON(http.StatusInternalServerError, models.NewErrorResponse(500, "获取记录失败: "+err.Error()))
		return
	}

	c.JSON(http.StatusOK, models.NewPaginationResponse(
		result.Page,
		result.PageSize,
		result.Total,
		result.Data,
	))
}

// GetRecord 获取单个记录
// @Summary 获取单个记录
// @Description 根据ID获取表中的单个记录
// @Tags 数据管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Param id path string true "记录ID"
// @Success 200 {object} models.APIResponse
// @Failure 404 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/data/{tableName}/{id} [get]
func (h *APIHandler) GetRecord(c *gin.Context) {
	tableName := c.Param("tableName")
	id := c.Param("id")

	record, err := h.dynamicAPI.GetRecord(tableName, id)
	if err != nil {
		if err.Error() == "记录不存在" {
			c.JSON(http.StatusNotFound, models.NewErrorResponse(404, err.Error()))
		} else {
			c.JSON(http.StatusInternalServerError, models.NewErrorResponse(500, "获取记录失败: "+err.Error()))
		}
		return
	}

	c.JSON(http.StatusOK, models.NewSuccessResponse(record))
}

// CreateRecord 创建记录
// @Summary 创建记录
// @Description 在指定表中创建新记录
// @Tags 数据管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Param data body models.DynamicRecord true "记录数据"
// @Success 201 {object} models.APIResponse
// @Failure 400 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/data/{tableName} [post]
func (h *APIHandler) CreateRecord(c *gin.Context) {
	tableName := c.Param("tableName")

	var data models.DynamicRecord
	if err := c.ShouldBindJSON(&data); err != nil {
		c.JSON(http.StatusBadRequest, models.NewErrorResponse(400, "请求数据格式错误: "+err.Error()))
		return
	}

	record, err := h.dynamicAPI.CreateRecord(tableName, data)
	if err != nil {
		c.JSON(http.StatusInternalServerError, models.NewErrorResponse(500, "创建记录失败: "+err.Error()))
		return
	}

	c.JSON(http.StatusCreated, models.NewSuccessResponse(record))
}

// UpdateRecord 更新记录
// @Summary 更新记录
// @Description 更新指定表中的记录
// @Tags 数据管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Param id path string true "记录ID"
// @Param data body models.DynamicRecord true "更新数据"
// @Success 200 {object} models.APIResponse
// @Failure 400 {object} models.APIResponse
// @Failure 404 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/data/{tableName}/{id} [put]
func (h *APIHandler) UpdateRecord(c *gin.Context) {
	tableName := c.Param("tableName")
	id := c.Param("id")

	var data models.DynamicRecord
	if err := c.ShouldBindJSON(&data); err != nil {
		c.JSON(http.StatusBadRequest, models.NewErrorResponse(400, "请求数据格式错误: "+err.Error()))
		return
	}

	record, err := h.dynamicAPI.UpdateRecord(tableName, id, data)
	if err != nil {
		if err.Error() == "记录不存在或更新失败" {
			c.JSON(http.StatusNotFound, models.NewErrorResponse(404, err.Error()))
		} else {
			c.JSON(http.StatusInternalServerError, models.NewErrorResponse(500, "更新记录失败: "+err.Error()))
		}
		return
	}

	c.JSON(http.StatusOK, models.NewSuccessResponse(record))
}

// DeleteRecord 删除记录
// @Summary 删除记录
// @Description 删除指定表中的记录
// @Tags 数据管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Param id path string true "记录ID"
// @Success 200 {object} models.APIResponse
// @Failure 404 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/data/{tableName}/{id} [delete]
func (h *APIHandler) DeleteRecord(c *gin.Context) {
	tableName := c.Param("tableName")
	id := c.Param("id")

	err := h.dynamicAPI.DeleteRecord(tableName, id)
	if err != nil {
		if err.Error() == "记录不存在" {
			c.JSON(http.StatusNotFound, models.NewErrorResponse(404, err.Error()))
		} else {
			c.JSON(http.StatusInternalServerError, models.NewErrorResponse(500, "删除记录失败: "+err.Error()))
		}
		return
	}

	c.JSON(http.StatusOK, models.NewSuccessResponse(map[string]string{
		"message": "记录删除成功",
	}))
}

// BatchDelete 批量删除记录
// @Summary 批量删除记录
// @Description 批量删除指定表中的多个记录
// @Tags 数据管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Param ids body []string true "记录ID列表"
// @Success 200 {object} models.APIResponse
// @Failure 400 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/data/{tableName}/batch [delete]
func (h *APIHandler) BatchDelete(c *gin.Context) {
	tableName := c.Param("tableName")

	var ids []string
	if err := c.ShouldBindJSON(&ids); err != nil {
		c.JSON(http.StatusBadRequest, models.NewErrorResponse(400, "请求数据格式错误: "+err.Error()))
		return
	}

	if len(ids) == 0 {
		c.JSON(http.StatusBadRequest, models.NewErrorResponse(400, "ID列表不能为空"))
		return
	}

	var successCount int
	var errors []string

	for _, id := range ids {
		err := h.dynamicAPI.DeleteRecord(tableName, id)
		if err != nil {
			errors = append(errors, "删除ID "+id+" 失败: "+err.Error())
		} else {
			successCount++
		}
	}

	result := map[string]interface{}{
		"success_count": successCount,
		"total_count":   len(ids),
	}

	if len(errors) > 0 {
		result["errors"] = errors
	}

	c.JSON(http.StatusOK, models.NewSuccessResponse(result))
}

// GetTableStats 获取表统计信息
// @Summary 获取表统计信息
// @Description 获取指定表的统计信息，如记录数等
// @Tags 表管理
// @Accept json
// @Produce json
// @Param tableName path string true "表名"
// @Success 200 {object} models.APIResponse
// @Failure 500 {object} models.APIResponse
// @Router /api/tables/{tableName}/stats [get]
func (h *APIHandler) GetTableStats(c *gin.Context) {
	tableName := c.Param("tableName")

	// 这里可以扩展更多统计信息
	pagination := models.PaginationRequest{Page: 1, PageSize: 1}
	result, err := h.dynamicAPI.GetRecords(tableName, pagination)
	if err != nil {
		c.JSON(http.StatusInternalServerError, models.NewErrorResponse(500, "获取表统计失败: "+err.Error()))
		return
	}

	stats := map[string]interface{}{
		"total_records": result.Total,
		"table_name":    tableName,
	}

	c.JSON(http.StatusOK, models.NewSuccessResponse(stats))
}
